/**
 * 
 */
package com.webwork.common.util;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 线程池工具类
 */
public class ThreadUtil {
	
	protected static ExecutorService threadPool = null;
	
	public static void initGlobalThread() {
		if (null == threadPool) {
			threadPool = Executors.newCachedThreadPool();
		}
	}
	
	/**
	 * 在全局缓存线程池(可回收旧线程)中执行一条新线程
	 * @param ct
	 */
	public static void executeGlobalThread(Runnable ct) {
		if (null == threadPool)
			initGlobalThread();
		
		if (null != threadPool && null != ct)
			threadPool.execute(ct);
	}
	
	/**
	 * 关闭全局缓存线程池(可回收旧线程)
	 * 慎用
	 * 通常用于qzs的job执行完成后关闭
	 */
	public static void shutdownGlobalThread() {
		if (null != threadPool)
			shutdownThread(threadPool);
	}

	/**
	 * 默认关闭线程池方法 等待3分钟
	 * 关闭线程池会拒绝新线程请求，等待正在进行的线程结束后正式关闭
	 * 对于非singleThread的线程池，shutdown方法会执行完线程池正在等待的线程，shutdownnow则只等待正在进行中的线程，不再执行等待的线程
	 * @param threadPool
	 */
	public static void shutdownThread(ExecutorService threadPool) {
		//等待关闭时间
//		int TIMEOUT_MINUTE = 3;
		shutdownThread(threadPool, 3);
	}
	
	/**
	 * 自定义线程池关闭结束时间
	 * 关闭线程池会拒绝新线程请求，等待正在进行的线程结束后正式关闭
	 * 对于非singleThread的线程池，shutdown方法会执行完线程池正在等待的线程，shutdownnow则只等待正在进行中的线程，不再执行等待的线程
	 * @param threadPool
	 * @param TIMEOUT_MINUTE (分钟)
	 */
	public static void shutdownThread(ExecutorService threadPool, int TIMEOUT_MINUTE) {
		threadPool.shutdown();
		try {
			if (!threadPool.awaitTermination(TIMEOUT_MINUTE, TimeUnit.MINUTES)) {
				// 超时的时候向线程池中所有的线程发出中断(interrupted)
				threadPool.shutdownNow();
			}
		} catch (InterruptedException e) {
			// awaitTermination方法被中断的时候也中止线程池中全部的线程的执行
			System.out.println("awaitTermination interrupted: " + e);
			threadPool.shutdownNow();
		}
	}
	
	/**
	 * 自定义线程池关闭结束时间
	 * 关闭线程池会拒绝新线程请求，等待正在进行的线程结束后正式关闭
	 * 对于非singleThread的线程池，shutdown方法会执行完线程池正在等待的线程，shutdownnow则只等待正在进行中的线程，不再执行等待的线程
	 * @param threadPool
	 * @param timeout_millseconds (毫秒)
	 */
	public static void shutdownThread(ExecutorService threadPool, long timeout_millseconds) {
		threadPool.shutdown();
		try {
			if (!threadPool.awaitTermination(timeout_millseconds, TimeUnit.MILLISECONDS)) {
				// 超时的时候向线程池中所有的线程发出中断(interrupted)
				threadPool.shutdownNow();
			}
		} catch (InterruptedException e) {
			// awaitTermination方法被中断的时候也中止线程池中全部的线程的执行
			System.out.println("awaitTermination interrupted: " + e);
			threadPool.shutdownNow();
		}
	}

}
